<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>无重复字符的最长子串 (使用滑动窗口的方法求解此题)</title>
</head>
<body>
  <!-- 给定一个字符串 s ，请你找出其中不含有重复字符的最长子串的长度。 -->
  <script>
    function fn(s) {
      // 哈希集合，记录每个字符是否出现过
      const set = new Set();
      const n = s.length;
      // 右指针，初始值为 -1，相当于我们在字符串的左边界的左侧，还没有开始移动
      let rk = -1, ans = 0;
      for (let i = 0; i < n; ++i) {
        if (i != 0) {
          // 左指针向右移动一格，移除一个字符
          set.delete(s.charAt(i - 1));
        }
        while (rk + 1 < n && !set.has(s.charAt(rk + 1))) {
          // 不断地移动右指针
          set.add(s.charAt(rk + 1));
          ++rk;
        }
        // 第 i 到 rk 个字符是一个极长的无重复字符子串
        ans = Math.max(ans, rk - i + 1);
      }
      return ans;
    }
    console.log(fn('abcabcbb'))
  </script>
</body>
</html>